﻿using System.ComponentModel.DataAnnotations.Schema;

namespace Core.Audit;

/// <summary>
/// 审计日志记录表
/// </summary>
[Table("AuditTrails")]
public class AuditTrail
{
    /// <summary>
    /// 审计记录的唯一标识符。
    /// </summary>
    /// <value>使用 GUID 确保全局唯一性。</value>
    public Guid Id { get; set; }

    /// <summary>
    /// 执行该操作的用户唯一标识。
    /// </summary>
    /// <value>如果操作由系统触发或匿名用户执行，则此值可能为空。</value>
    public Guid? UserId { get; set; }

    /// <summary>
    /// 操作类型，例如 "Create"、"Update"、"Delete"。
    /// </summary>
    /// <value>用于区分不同的数据变更行为。</value>
    public string? Operation { get; set; }

    /// <summary>
    /// 被操作的实体名称，例如 "User"、"Order"、"Product"。
    /// </summary>
    /// <value>便于按业务对象类型进行过滤和分析。</value>
    public string? Entity { get; set; }

    /// <summary>
    /// 操作发生的时间戳，包含时区信息。
    /// </summary>
    /// <value>使用 DateTimeOffset 可准确表示跨时区系统的操作时间。</value>
    public DateTimeOffset DateTime { get; set; }

    /// <summary>
    /// 操作前的原始属性值集合，以序列化格式（如 JSON）存储。
    /// </summary>
    /// <value>可用于展示“旧值”对比，辅助问题排查。</value>
    public string? PreviousValues { get; set; }

    /// <summary>
    /// 操作后的新属性值集合，以序列化格式（如 JSON）存储。
    /// </summary>
    /// <value>与 PreviousValues 配合使用，构建完整的变更视图。</value>
    public string? NewValues { get; set; }

    /// <summary>
    /// 被修改的属性名称列表，多个属性可用逗号分隔或以 JSON 数组形式存储。
    /// </summary>
    /// <value>提高审计效率，避免全字段比对。</value>
    public string? ModifiedProperties { get; set; }

    /// <summary>
    /// 被操作实体的主键值，用于定位具体记录。
    /// </summary>
    /// <value>即使原实体已被删除，仍可通过此键关联历史记录。</value>
    public string? PrimaryKey { get; set; }
}
